﻿using System;

namespace CamlQueryCreator.Common
{
    /// <summary>
    /// Оператор сравнения с текущим пользователем для CAML-запроса.
    /// </summary>
    public sealed class CamlOperatorCurrentUser : CamlOperator
    {
        private const string ERROR_FORMAT = "Для применения данного фильтра тип поля должен быть \"{0}\"";

        private readonly string _fieldName;
        private readonly OperationKind _operationKind;

        /// <summary>
        /// Оператор сравнения с текущим пользователем для CAML-запроса.
        /// <para>Конструктор.</para>
        /// </summary>
        internal CamlOperatorCurrentUser(CamlConnector parentBuilder, IListFieldInfoBase fieldInfo, OperationKind operationKind)
            : this(parentBuilder, fieldInfo.Name, operationKind)
        {
            if (fieldInfo.CamlQueryFieldType != FieldTypeKind.User)
                throw new ArgumentOutOfRangeException(string.Format(ERROR_FORMAT, FieldTypeKind.User));
        }

        /// <summary>
        /// Оператор сравнения с текущим пользователем для CAML-запроса.
        /// <para>Конструктор.</para>
        /// </summary>
        internal CamlOperatorCurrentUser(CamlConnector parentBuilder, string fieldName, OperationKind operationKind)
            : base(parentBuilder)
        {
            _fieldName = fieldName;
            _operationKind = operationKind;
        }

        #region Overrides of CamlBase

        protected override string GetQuery(string childQuery)
        {
            const string format =
                "<{1}><FieldRef Name='{0}'/><Value Type='Integer'><UserID Type='Integer'/></Value></{1}>";
            return string.Format(format, _fieldName, _operationKind.ToName());
        }

        #endregion
    }
}
